home *** CD-ROM | disk | FTP | other *** search
/ Young Minds / Young Minds Interactive CD-ROM.ISO / dungeon / nobjs.f < prev    next >
Encoding:
Text File  |  1987-09-16  |  12.7 KB  |  661 lines

  1. C NOBJS-    NEW OBJECTS PROCESSOR
  2. C    OBJECTS IN THIS MODULE CANNOT CALL RMINFO, JIGSUP,
  3. C    MAJOR VERBS, OR OTHER NON-RESIDENT SUBROUTINES
  4. C
  5. C COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
  6. C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
  7. C WRITTEN BY R. M. SUPNIK
  8. C
  9. C DECLARATIONS
  10. C
  11.     LOGICAL FUNCTION NOBJS(RI,ARG)
  12.     IMPLICIT INTEGER (A-Z)
  13.     LOGICAL QOPEN,MOVETO,F
  14.     LOGICAL QHERE,OPNCLS,MIRPAN
  15. #include "parser.h"
  16. #include "gamestate.h"
  17. #include "state.h"
  18. #include "screen.h"
  19. #include "puzzle.h"
  20. C
  21. C MISCELLANEOUS VARIABLES
  22. C
  23.     COMMON /HYPER/ HFACTR
  24. #include "rooms.h"
  25. #include "rflag.h"
  26. #include "rindex.h"
  27. #include "objects.h"
  28. #include "oflags.h"
  29. #include "oindex.h"
  30. #include "clock.h"
  31.  
  32. #include "villians.h"
  33. #include "advers.h"
  34. #include "verbs.h"
  35. #include "flags.h"
  36. C
  37. C FUNCTIONS AND DATA
  38. C
  39.     QOPEN(R)=and(OFLAG2(R),OPENBT).NE.0
  40. C NOBJS, PAGE 2
  41. C
  42.     IF(PRSO.NE.0) ODO2=ODESC2(PRSO)
  43.     IF(PRSI.NE.0) ODI2=ODESC2(PRSI)
  44.     AV=AVEHIC(WINNER)
  45.     NOBJS=.TRUE.
  46. C
  47.     GO TO (1000,2000,3000,4000,5000,6000,7000,8000,9000,
  48. &     10000,11000,12000,13000,14000,15000,16000,17000,
  49. &     18000,19000,20000,21000),
  50. &        (RI-31)
  51.     CALL BUG(6,RI)
  52. C
  53. C RETURN HERE TO DECLARE FALSE RESULT
  54. C
  55. 10    NOBJS=.FALSE.
  56.     RETURN
  57. C
  58. C O32--    BILLS
  59. C
  60. 1000    IF(PRSA.NE.EATW) GO TO 1100
  61. C                        !EAT?
  62.     CALL RSPEAK(639)
  63. C                        !JOKE.
  64.     RETURN
  65. C
  66. 1100    IF(PRSA.EQ.BURNW) CALL RSPEAK(640)
  67. C                        !BURN?  JOKE.
  68.     GO TO 10
  69. C                        !LET IT BE HANDLED.
  70. C NOBJS, PAGE 3
  71. C
  72. C O33--    SCREEN OF LIGHT
  73. C
  74. 2000    TARGET=SCOL
  75. C                        !TARGET IS SCOL.
  76. 2100    IF(PRSO.NE.TARGET) GO TO 2400
  77. C                        !PRSO EQ TARGET?
  78.     IF((PRSA.NE.PUSHW).AND.(PRSA.NE.MOVEW).AND.
  79. &        (PRSA.NE.TAKEW).AND.(PRSA.NE.RUBW)) GO TO 2200
  80.     CALL RSPEAK(673)
  81. C                        !HAND PASSES THRU.
  82.     RETURN
  83. C
  84. 2200    IF((PRSA.NE.KILLW).AND.(PRSA.NE.ATTACW).AND.
  85. &        (PRSA.NE.MUNGW)) GO TO 2400
  86.     CALL RSPSUB(674,ODI2)
  87. C                        !PASSES THRU.
  88.     RETURN
  89. C
  90. 2400    IF((PRSA.NE.THROWW).OR.(PRSI.NE.TARGET)) GO TO 10
  91.     IF(HERE.EQ.BKBOX) GO TO 2600
  92. C                        !THRU SCOL?
  93.     CALL NEWSTA(PRSO,0,BKBOX,0,0)
  94. C                        !NO, THRU WALL.
  95.     CALL RSPSUB(675,ODO2)
  96. C                        !ENDS UP IN BOX ROOM.
  97.     CTICK(CEVSCL)=0
  98. C                        !CANCEL ALARM.
  99.     SCOLRM=0
  100. C                        !RESET SCOL ROOM.
  101.     RETURN
  102. C
  103. 2600    IF(SCOLRM.EQ.0) GO TO 2900
  104. C                        !TRIED TO GO THRU?
  105.     CALL NEWSTA(PRSO,0,SCOLRM,0,0)
  106. C                        !SUCCESS.
  107.     CALL RSPSUB(676,ODO2)
  108. C                        !ENDS UP SOMEWHERE.
  109.     CTICK(CEVSCL)=0
  110. C                        !CANCEL ALARM.
  111.     SCOLRM=0
  112. C                        !RESET SCOL ROOM.
  113.     RETURN
  114. C
  115. 2900    CALL RSPEAK(213)
  116. C                        !CANT DO IT.
  117.     RETURN
  118. C NOBJS, PAGE 4
  119. C
  120. C O34--    GNOME OF ZURICH
  121. C
  122. 3000    IF((PRSA.NE.GIVEW).AND.(PRSA.NE.THROWW)) GO TO 3200
  123.     IF(OTVAL(PRSO).NE.0) GO TO 3100
  124. C                        !THROW A TREASURE?
  125.     CALL NEWSTA(PRSO,641,0,0,0)
  126. C                        !NO, GO POP.
  127.     RETURN
  128. C
  129. 3100    CALL NEWSTA(PRSO,0,0,0,0)
  130. C                        !YES, BYE BYE TREASURE.
  131.     CALL RSPSUB(642,ODO2)
  132.     CALL NEWSTA(ZGNOM,0,0,0,0)
  133. C                        !BYE BYE GNOME.
  134.     CTICK(CEVZGO)=0
  135. C                        !CANCEL EXIT.
  136.     F=MOVETO(BKENT,WINNER)
  137. C                        !NOW IN BANK ENTRANCE.
  138.     RETURN
  139. C
  140. 3200    IF((PRSA.NE.ATTACW).AND.(PRSA.NE.KILLW).AND.
  141. &        (PRSA.NE.MUNGW)) GO TO 3300
  142.     CALL NEWSTA(ZGNOM,643,0,0,0)
  143. C                        !VANISH GNOME.
  144.     CTICK(CEVZGO)=0
  145. C                        !CANCEL EXIT.
  146.     RETURN
  147. C
  148. 3300    CALL RSPEAK(644)
  149. C                        !GNOME IS IMPATIENT.
  150.     RETURN
  151. C
  152. C O35--    EGG
  153. C
  154. 4000    IF((PRSA.NE.OPENW).OR.(PRSO.NE.EGG)) GO TO 4500
  155.     IF(.NOT.QOPEN(EGG)) GO TO 4100
  156. C                        !OPEN ALREADY?
  157.     CALL RSPEAK(649)
  158. C                        !YES.
  159.     RETURN
  160. C
  161. 4100    IF(PRSI.NE.0) GO TO 4200
  162. C                        !WITH SOMETHING?
  163.     CALL RSPEAK(650)
  164. C                        !NO, CANT.
  165.     RETURN
  166. C
  167. 4200    IF(PRSI.NE.HANDS) GO TO 4300
  168. C                        !WITH HANDS?
  169.     CALL RSPEAK(651)
  170. C                        !NOT RECOMMENDED.
  171.     RETURN
  172. C
  173. 4300    I=652
  174. C                        !MUNG MESSAGE.
  175.     IF((and(OFLAG1(PRSI),TOOLBT).NE.0).OR.
  176. &        (and(OFLAG2(PRSI),WEAPBT).NE.0)) GO TO 4600
  177.     I=653
  178. C                        !NOVELTY 1.
  179.     IF(and(OFLAG2(PRSO),FITEBT).NE.0) I=654
  180.     OFLAG2(PRSO)=or(OFLAG2(PRSO),FITEBT)
  181.     CALL RSPSUB(I,ODI2)
  182.     RETURN
  183. C
  184. 4500    IF((PRSA.NE.OPENW).AND.(PRSA.NE.MUNGW)) GO TO 4800
  185.     I=655
  186. C                        !YOU BLEW IT.
  187. 4600    CALL NEWSTA(BEGG,I,OROOM(EGG),OCAN(EGG),OADV(EGG))
  188.     CALL NEWSTA(EGG,0,0,0,0)
  189. C                        !VANISH EGG.
  190.     OTVAL(BEGG)=2
  191. C                        !BAD EGG HAS VALUE.
  192.     IF(OCAN(CANAR).NE.EGG) GO TO 4700
  193. C                        !WAS CANARY INSIDE?
  194.     CALL RSPEAK(ODESCO(BCANA))
  195. C                        !YES, DESCRIBE RESULT.
  196.     OTVAL(BCANA)=1
  197.     RETURN
  198. C
  199. 4700    CALL NEWSTA(BCANA,0,0,0,0)
  200. C                        !NO, VANISH IT.
  201.     RETURN
  202. C
  203. 4800    IF((PRSA.NE.DROPW).OR.(HERE.NE.MTREE)) GO TO 10
  204.     CALL NEWSTA(BEGG,658,FORE3,0,0)
  205. C                        !DROPPED EGG.
  206.     CALL NEWSTA(EGG,0,0,0,0)
  207.     OTVAL(BEGG)=2
  208.     IF(OCAN(CANAR).NE.EGG) GO TO 4700
  209.     OTVAL(BCANA)=1
  210. C                        !BAD CANARY.
  211.     RETURN
  212. C NOBJS, PAGE 5
  213. C
  214. C O36--    CANARIES, GOOD AND BAD
  215. C
  216. 5000    IF(PRSA.NE.WINDW) GO TO 10
  217. C                        !WIND EM UP?
  218.     IF(PRSO.EQ.CANAR) GO TO 5100
  219. C                        !RIGHT ONE?
  220.     CALL RSPEAK(645)
  221. C                        !NO, BAD NEWS.
  222.     RETURN
  223. C
  224. 5100    IF(.NOT.SINGSF.AND.((HERE.EQ.MTREE).OR.
  225. &        ((HERE.GE.FORE1).AND.(HERE.LT.CLEAR))))
  226. &        GO TO 5200
  227.     CALL RSPEAK(646)
  228. C                        !NO, MEDIOCRE NEWS.
  229.     RETURN
  230. C
  231. 5200    SINGSF=.TRUE.
  232. C                        !SANG SONG.
  233.     I=HERE
  234.     IF(I.EQ.MTREE) I=FORE3
  235. C                        !PLACE BAUBLE.
  236.     CALL NEWSTA(BAUBL,647,I,0,0)
  237.     RETURN
  238. C
  239. C O37--    WHITE CLIFFS
  240. C
  241. 6000    IF((PRSA.NE.CLMBW).AND.(PRSA.NE.CLMBUW).AND.
  242. &        (PRSA.NE.CLMBDW)) GO TO 10
  243.     CALL RSPEAK(648)
  244. C                        !OH YEAH?
  245.     RETURN
  246. C
  247. C O38--    WALL
  248. C
  249. 7000    IF((IABS(HERE-MLOC).NE.1).OR.(MRHERE(HERE).NE.0).OR.
  250. &        (PRSA.NE.PUSHW)) GO TO 7100
  251.     CALL RSPEAK(860)
  252. C                        !PUSHED MIRROR WALL.
  253.     RETURN
  254. C
  255. 7100    IF(and(RFLAG(HERE),RNWALL).EQ.0) GO TO 10
  256.     CALL RSPEAK(662)
  257. C                        !NO WALL.
  258.     RETURN
  259. C NOBJS, PAGE 6
  260. C
  261. C O39--    SONG BIRD GLOBAL
  262. C
  263. 8000    IF(PRSA.NE.FINDW) GO TO 8100
  264. C                        !FIND?
  265.     CALL RSPEAK(666)
  266.     RETURN
  267. C
  268. 8100    IF(PRSA.NE.EXAMIW) GO TO 10
  269. C                        !EXAMINE?
  270.     CALL RSPEAK(667)
  271.     RETURN
  272. C
  273. C O40--    PUZZLE/SCOL WALLS
  274. C
  275. 9000    IF(HERE.NE.CPUZZ) GO TO 9500
  276. C                        !PUZZLE WALLS?
  277.     IF(PRSA.NE.PUSHW) GO TO 10
  278. C                        !PUSH?
  279.     DO 9100 I=1,8,2
  280. C                        !LOCATE WALL.
  281.       IF(PRSO.EQ.CPWL(I)) GO TO 9200
  282. 9100    CONTINUE
  283.     CALL BUG(80,PRSO)
  284. C                        !WHAT?
  285. C
  286. 9200    J=CPWL(I+1)
  287. C                        !GET DIRECTIONAL OFFSET.
  288.     NXT=CPHERE+J
  289. C                        !GET NEXT STATE.
  290.     WL=CPVEC(NXT)
  291. C                        !GET C(NEXT STATE).
  292.     GO TO (9300,9300,9300,9250,9350),(WL+4)
  293. C                        !PROCESS.
  294. C
  295. 9250    CALL RSPEAK(876)
  296. C                        !CLEAR CORRIDOR.
  297.     RETURN
  298. C
  299. 9300    IF(CPVEC(NXT+J).EQ.0) GO TO 9400
  300. C                        !MOVABLE, ROOM TO MOVE?
  301. 9350    CALL RSPEAK(877)
  302. C                        !IMMOVABLE, NO ROOM.
  303.     RETURN
  304. C
  305. 9400    I=878
  306. C                        !ASSUME FIRST PUSH.
  307.     IF(CPUSHF) I=879
  308. C                        !NOT?
  309.     CPUSHF=.TRUE.
  310.     CPVEC(NXT+J)=WL
  311. C                        !MOVE WALL.
  312.     CPVEC(NXT)=0
  313. C                        !VACATE NEXT STATE.
  314.     CALL CPGOTO(NXT)
  315. C                        !ONWARD.
  316.     CALL CPINFO(I,NXT)
  317. C                        !DESCRIBE.
  318.     CALL PRINCR(.TRUE.,HERE)
  319. C                        !PRINT ROOMS CONTENTS.
  320.     RFLAG(HERE)=or(RFLAG(HERE),RSEEN)
  321.     RETURN
  322. C
  323. 9500    IF(HERE.NE.SCOLAC) GO TO 9700
  324. C                        !IN SCOL ACTIVE ROOM?
  325.     DO 9600 I=1,12,3
  326.       TARGET=SCOLWL(I+1)
  327. C                        !ASSUME TARGET.
  328.       IF(SCOLWL(I).EQ.HERE) GO TO 2100
  329. C                        !TREAT IF FOUND.
  330. 9600    CONTINUE
  331. C
  332. 9700    IF(HERE.NE.BKBOX) GO TO 10
  333. C                        !IN BOX ROOM?
  334.     TARGET=WNORT
  335.     GO TO 2100
  336. C NOBJS, PAGE 7
  337. C
  338. C O41--    SHORT POLE
  339. C
  340. 10000    IF(PRSA.NE.RAISEW) GO TO 10100
  341. C                        !LIFT?
  342.     I=749
  343. C                        !ASSUME UP.
  344.     IF(POLEUF.EQ.2) I=750
  345. C                        !ALREADY UP?
  346.     CALL RSPEAK(I)
  347.     POLEUF=2
  348. C                        !POLE IS RAISED.
  349.     RETURN
  350. C
  351. 10100    IF((PRSA.NE.LOWERW).AND.(PRSA.NE.PUSHW)) GO TO 10
  352.     IF(POLEUF.NE.0) GO TO 10200
  353. C                        !ALREADY LOWERED?
  354.     CALL RSPEAK(751)
  355. C                        !CANT DO IT.
  356.     RETURN
  357. C
  358. 10200    IF(MOD(MDIR,180).NE.0) GO TO 10300
  359. C                        !MIRROR N-S?
  360.     POLEUF=0
  361. C                        !YES, LOWER INTO
  362.     CALL RSPEAK(752)
  363. C                        !CHANNEL.
  364.     RETURN
  365. C
  366. 10300    IF((MDIR.NE.270).OR.(MLOC.NE.MRB)) GO TO 10400
  367.     POLEUF=0
  368. C                        !LOWER INTO HOLE.
  369.     CALL RSPEAK(753)
  370.     RETURN
  371. C
  372. 10400    CALL RSPEAK(753+POLEUF)
  373. C                        !POLEUF = 1 OR 2.
  374.     POLEUF=1
  375. C                        !NOW ON FLOOR.
  376.     RETURN
  377. C
  378. C O42--    MIRROR SWITCH
  379. C
  380. 11000    IF(PRSA.NE.PUSHW) GO TO 10
  381. C                        !PUSH?
  382.     IF(MRPSHF) GO TO 11300
  383. C                        !ALREADY PUSHED?
  384.     CALL RSPEAK(756)
  385. C                        !BUTTON GOES IN.
  386.     DO 11100 I=1,OLNT
  387. C                        !BLOCKED?
  388.       IF(QHERE(I,MREYE).AND.(I.NE.RBEAM)) GO TO 11200
  389. 11100    CONTINUE
  390.     CALL RSPEAK(757)
  391. C                        !NOTHING IN BEAM.
  392.     RETURN
  393. C
  394. 11200    CFLAG(CEVMRS)=.TRUE.
  395. C                        !MIRROR OPENS.
  396.     CTICK(CEVMRS)=7
  397.     MRPSHF=.TRUE.
  398.     MROPNF=.TRUE.
  399.     RETURN
  400. C
  401. 11300    CALL RSPEAK(758)
  402. C                        !MIRROR ALREADYOPEN.
  403.     RETURN
  404. C NOBJS, PAGE 8
  405. C
  406. C O43--    BEAM FUNCTION
  407. C
  408. 12000    IF((PRSA.NE.TAKEW).OR.(PRSO.NE.RBEAM)) GO TO 12100
  409.     CALL RSPEAK(759)
  410. C                        !TAKE BEAM, JOKE.
  411.     RETURN
  412. C
  413. 12100    I=PRSO
  414. C                        !ASSUME BLK WITH DIROBJ.
  415.     IF((PRSA.EQ.PUTW).AND.(PRSI.EQ.RBEAM)) GO TO 12200
  416.     IF((PRSA.NE.MUNGW).OR.(PRSO.NE.RBEAM).OR.
  417. &        (PRSI.EQ.0)) GO TO 10
  418.     I=PRSI
  419. 12200    IF(OADV(I).NE.WINNER) GO TO 12300
  420. C                        !CARRYING?
  421.     CALL NEWSTA(I,0,HERE,0,0)
  422. C                        !DROP OBJ.
  423.     CALL RSPSUB(760,ODESC2(I))
  424.     RETURN
  425. C
  426. 12300    J=761
  427. C                        !ASSUME NOT IN ROOM.
  428.     IF(QHERE(J,HERE)) I=762
  429. C                        !IN ROOM?
  430.     CALL RSPSUB(J,ODESC2(I))
  431. C                        !DESCRIBE.
  432.     RETURN
  433. C
  434. C O44--    BRONZE DOOR
  435. C
  436. 13000    IF((HERE.EQ.NCELL).OR.((LCELL.EQ.4).AND.
  437. &        ((HERE.EQ.CELL).OR.(HERE.EQ.SCORR))))
  438. &        GO TO 13100
  439.     CALL RSPEAK(763)
  440. C                        !DOOR NOT THERE.
  441.     RETURN
  442. C
  443. 13100    IF(.NOT.OPNCLS(ODOOR,764,765)) GO TO 10
  444. C                        !OPEN/CLOSE?
  445.     IF((HERE.EQ.NCELL).AND.QOPEN(ODOOR))
  446. &        CALL RSPEAK(766)
  447.     RETURN
  448. C
  449. C O45--    QUIZ DOOR
  450. C
  451. 14000    IF((PRSA.NE.OPENW).AND.(PRSA.NE.CLOSEW)) GO TO 14100
  452.     CALL RSPEAK(767)
  453. C                        !DOOR WONT MOVE.
  454.     RETURN
  455. C
  456. 14100    IF(PRSA.NE.KNOCKW) GO TO 10
  457. C                        !KNOCK?
  458.     IF(INQSTF) GO TO 14200
  459. C                        !TRIED IT ALREADY?
  460.     INQSTF=.TRUE.
  461. C                        !START INQUISITION.
  462.     CFLAG(CEVINQ)=.TRUE.
  463.     CTICK(CEVINQ)=2
  464.     QUESNO=RND(8)
  465. C                        !SELECT QUESTION.
  466.     NQATT=0
  467.     CORRCT=0
  468.     CALL RSPEAK(768)
  469. C                        !ANNOUNCE RULES.
  470.     CALL RSPEAK(769)
  471.     CALL RSPEAK(770+QUESNO)
  472. C                        !ASK QUESTION.
  473.     RETURN
  474. C
  475. 14200    CALL RSPEAK(798)
  476. C                        !NO REPLY.
  477.     RETURN
  478. C
  479. C O46--    LOCKED DOOR
  480. C
  481. 15000    IF(PRSA.NE.OPENW) GO TO 10
  482. C                        !OPEN?
  483.     CALL RSPEAK(778)
  484. C                        !CANT.
  485.     RETURN
  486. C
  487. C O47--    CELL DOOR
  488. C
  489. 16000    NOBJS=OPNCLS(CDOOR,779,780)
  490. C                        !OPEN/CLOSE?
  491.     RETURN
  492. C NOBJS, PAGE 9
  493. C
  494. C O48--    DIALBUTTON
  495. C
  496. 17000    IF(PRSA.NE.PUSHW) GO TO 10
  497. C                        !PUSH?
  498.     CALL RSPEAK(809)
  499. C                        !CLICK.
  500.     IF(QOPEN(CDOOR)) CALL RSPEAK(810)
  501. C                        !CLOSE CELL DOOR.
  502. C
  503.     DO 17100 I=1,OLNT
  504. C                        !RELOCATE OLD TO HYPER.
  505.       IF((OROOM(I).EQ.CELL).AND.(and(OFLAG1(I),DOORBT).EQ.0))
  506. &        CALL NEWSTA(I,0,LCELL*HFACTR,0,0)
  507.       IF(OROOM(I).EQ.(PNUMB*HFACTR))
  508. &        CALL NEWSTA(I,0,CELL,0,0)
  509. 17100    CONTINUE
  510. C
  511.     OFLAG2(ODOOR)=and(OFLAG2(ODOOR), not(OPENBT))
  512.     OFLAG2(CDOOR)=and(OFLAG2(CDOOR), not(OPENBT))
  513.     OFLAG1(ODOOR)=and(OFLAG1(ODOOR), not(VISIBT))
  514.     IF(PNUMB.EQ.4) OFLAG1(ODOOR)=or(OFLAG1(ODOOR),VISIBT)
  515. C
  516.     IF(AROOM(PLAYER).NE.CELL) GO TO 17400
  517. C                        !PLAYER IN CELL?
  518.     IF(LCELL.NE.4) GO TO 17200
  519. C                        !IN RIGHT CELL?
  520.     OFLAG1(ODOOR)=or(OFLAG1(ODOOR), VISIBT)
  521.     F=MOVETO(NCELL,PLAYER)
  522. C                        !YES, MOVETO NCELL.
  523.     GO TO 17400
  524. 17200    F=MOVETO(PCELL,PLAYER)
  525. C                        !NO, MOVETO PCELL.
  526. C
  527. 17400    LCELL=PNUMB
  528.     RETURN
  529. C NOBJS, PAGE 10
  530. C
  531. C O49--    DIAL INDICATOR
  532. C
  533. 18000    IF(PRSA.NE.SPINW) GO TO 18100
  534. C                        !SPIN?
  535.     PNUMB=RND(8)+1
  536. C                        !WHEE
  537. C                        !
  538.     CALL RSPSUB(797,712+PNUMB)
  539.     RETURN
  540. C
  541. 18100    IF((PRSA.NE.MOVEW).AND.(PRSA.NE.PUTW).AND.
  542. &        (PRSA.NE.TRNTOW)) GO TO 10
  543.     IF(PRSI.NE.0) GO TO 18200
  544. C                        !TURN DIAL TO X?
  545.     CALL RSPEAK(806)
  546. C                        !MUST SPECIFY.
  547.     RETURN
  548. C
  549. 18200    IF((PRSI.GE.NUM1).AND.(PRSI.LE.NUM8)) GO TO 18300
  550.     CALL RSPEAK(807)
  551. C                        !MUST BE DIGIT.
  552.     RETURN
  553. C
  554. 18300    PNUMB=PRSI-NUM1+1
  555. C                        !SET UP NEW.
  556.     CALL RSPSUB(808,712+PNUMB)
  557.     RETURN
  558. C
  559. C O50--    GLOBAL MIRROR
  560. C
  561. 19000    NOBJS=MIRPAN(832,.FALSE.)
  562.     RETURN
  563. C
  564. C O51--    GLOBAL PANEL
  565. C
  566. 20000    IF(HERE.NE.FDOOR) GO TO 20100
  567. C                        !AT FRONT DOOR?
  568.     IF((PRSA.NE.OPENW).AND.(PRSA.NE.CLOSEW)) GO TO 10
  569.     CALL RSPEAK(843)
  570. C                        !PANEL IN DOOR, NOGO.
  571.     RETURN
  572. C
  573. 20100    NOBJS=MIRPAN(838,.TRUE.)
  574.     RETURN
  575. C
  576. C O52--    PUZZLE ROOM SLIT
  577. C
  578. 21000    IF((PRSA.NE.PUTW).OR.(PRSI.NE.CSLIT)) GO TO 10
  579.     IF(PRSO.NE.GCARD) GO TO 21100
  580. C                        !PUT CARD IN SLIT?
  581.     CALL NEWSTA(PRSO,863,0,0,0)
  582. C                        !KILL CARD.
  583.     CPOUTF=.TRUE.
  584. C                        !OPEN DOOR.
  585.     OFLAG1(STLDR)=and(OFLAG1(STLDR),not(VISIBT))
  586.     RETURN
  587. C
  588. 21100    IF((and(OFLAG1(PRSO),VICTBT).EQ.0).AND.
  589. &      (and(OFLAG2(PRSO),VILLBT).EQ.0)) GO TO 21200
  590.     CALL RSPEAK(RND(5)+552)
  591. C                        !JOKE FOR VILL, VICT.
  592.     RETURN
  593. C
  594. 21200    CALL NEWSTA(PRSO,0,0,0,0)
  595. C                        !KILL OBJECT.
  596.     CALL RSPSUB(864,ODO2)
  597. C                        !DESCRIBE.
  598.     RETURN
  599. C
  600.     END
  601. C MIRPAN--    PROCESSOR FOR GLOBAL MIRROR/PANEL
  602. C
  603. C DECLARATIONS
  604. C
  605.     LOGICAL FUNCTION MIRPAN(ST,PNF)
  606.     IMPLICIT INTEGER(A-Z)
  607.     LOGICAL PNF
  608. #include "gamestate.h"
  609. #include "parser.h"
  610. #include "verbs.h"
  611. #include "flags.h"
  612. C MIRPAN, PAGE 2
  613. C
  614.     MIRPAN=.TRUE.
  615.     NUM=MRHERE(HERE)
  616. C                        !GET MIRROR NUM.
  617.     IF(NUM.NE.0) GO TO 100
  618. C                        !ANY HERE?
  619.     CALL RSPEAK(ST)
  620. C                        !NO, LOSE.
  621.     RETURN
  622. C
  623. 100    MRBF=0
  624. C                        !ASSUME MIRROR OK.
  625.     IF(((NUM.EQ.1).AND..NOT.MR1F).OR.
  626. &      ((NUM.EQ.2).AND..NOT.MR2F)) MRBF=1
  627.     IF((PRSA.NE.MOVEW).AND.(PRSA.NE.OPENW)) GO TO 200
  628.     CALL RSPEAK(ST+1)
  629. C                        !CANT OPEN OR MOVE.
  630.     RETURN
  631. C
  632. 200    IF(PNF.OR.((PRSA.NE.LOOKIW).AND.(PRSA.NE.EXAMIW).AND.
  633. &        (PRSA.NE.LOOKW))) GO TO 300
  634.     CALL RSPEAK(844+MRBF)
  635. C                        !LOOK IN MIRROR.
  636.     RETURN
  637. C
  638. 300    IF(PRSA.NE.MUNGW) GO TO 400
  639. C                        !BREAK?
  640.     CALL RSPEAK(ST+2+MRBF)
  641. C                        !DO IT.
  642.     IF((NUM.EQ.1).AND..NOT.PNF) MR1F=.FALSE.
  643.     IF((NUM.EQ.2).AND..NOT.PNF) MR2F=.FALSE.
  644.     RETURN
  645. C
  646. 400    IF(PNF.OR.(MRBF.EQ.0)) GO TO 500
  647. C                        !BROKEN MIRROR?
  648.     CALL RSPEAK(846)
  649.     RETURN
  650. C
  651. 500    IF(PRSA.NE.PUSHW) GO TO 600
  652. C                        !PUSH?
  653.     CALL RSPEAK(ST+3+NUM)
  654.     RETURN
  655. C
  656. 600    MIRPAN=.FALSE.
  657. C                        !CANT HANDLE IT.
  658.     RETURN
  659. C
  660.     END
  661.